package com.vst.orm.util;

import java.io.IOException;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Random;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @className:DateUtil.java
 * @classDescription:时间处理类
 */
public class DateUtil {
	private static Log log = LogFactory.getLog(DateUtil.class);
	private static String defaultDatePattern = null;
	
	public static String getDatePattern() {
		try {
			defaultDatePattern = "yyyy-MM-dd";
		} catch (MissingResourceException mse) {
			defaultDatePattern = "yyyy-MM-dd";
		}

		return defaultDatePattern;
	}
	
	public static final String getDateTime(String aMask, Date aDate) {
		SimpleDateFormat df = null;
		String returnValue = "";

		if (aDate == null) {
			log.error("aDate is null!");
		} else {
			df = new SimpleDateFormat(aMask);
			returnValue = df.format(aDate);
		}

		return (returnValue);
	}
	
	public static final String getDateTime(String aMask, java.sql.Timestamp aDate) {
		SimpleDateFormat df = null;
		String returnValue = "";

		if (aDate == null) {
			log.error("aDate is null!");
		} else {
			df = new SimpleDateFormat(aMask);
			returnValue = df.format(aDate);
		}

		return (returnValue);
	}
	
	public static final String getDateTime(String aMask, java.util.Date aDate) {
		SimpleDateFormat df = null;
		String returnValue = "";

		if (aDate == null) {
			log.error("aDate is null!");
		} else {
			df = new SimpleDateFormat(aMask);
			returnValue = df.format(aDate);
		}

		return (returnValue);
	}
	
	public static String dateToString(Timestamp date, String format) {
		return getDateTime(format, date);
	}

	public static String dateToString(java.util.Date date, String format) {
		return getDateTime(format, date);
	}

	public static java.util.Date dateToDate(java.util.Date date, String format) {
		return stringToDate(dateToString(date, format),format);
	}

	public static java.util.Date stringToDate(String dateString, String format) {
		SimpleDateFormat df = null;
		java.util.Date date = null;
		df = new SimpleDateFormat(format);

		try {
			date = df.parse(dateString);
		} catch (ParseException pe) {
			df = new SimpleDateFormat(getDatePattern());
			try {
				date = df.parse(dateString);
			} catch (ParseException ex) {
				return null;
			}
		}

		return (date);
	}

	/**
	 * 比较两个时间的差值(以秒为单位)
	 * 
	 * @param date1
	 *            时间1
	 * @param date2
	 *            时间2
	 * @return long
	 */
	public static long dateDiff(java.util.Date date1, java.util.Date date2) {
		// return date1.getTime() / (24*60*60*1000) - date2.getTime() /
		// (24*60*60*1000);
		return date2.getTime() / 1000 - date1.getTime() / 1000; // 用立即数，减少乘法计算的开销
	}

	/**
	 * 作用：获取当前日期 格式 2007－3－4 返回类型：Date 参数：null
	 */
	public static Date date() {
		// 获取当前日期
		String strDate = new SimpleDateFormat("yyyy-MM-dd").format(Calendar
				.getInstance().getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return Date.valueOf(strDate);
	}
	/**
	 * 获取当前日期的前几天或者后几天日期
	 * @param day 天数 负数代表前几天，正数代表后几天
	 * @return
	 */
	public static Date getDateByDay(int day){
		// 获取当前日期
		Calendar date = Calendar.getInstance();
		date.set(Calendar.DATE, date.get(Calendar.DATE)+day);   		
		String strDate = new SimpleDateFormat("yyyy-MM-dd").format(date.getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return Date.valueOf(strDate);
	}

	/**
	 * 作用：获取当前日期 格式 2007－3－4 12：10：20 返回类型：Date 参数：null
	 */
	public static Timestamp datetime() {
		// 获取当前日期
		String strTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
				.format(Calendar.getInstance().getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return Timestamp.valueOf(strTimestamp);
	}
	/**
	 * 作用：获取当前日期 格式 2007－3－4 12：10：20 返回类型：Date 参数：null
	 */
	public static String datetimeByString() {
		// 获取当前日期
		String strTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
				.format(Calendar.getInstance().getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return strTimestamp;
	}
	/**
	 * 获取当前时间 时间格式yyyy-MM-dd
	 */
	public static String todayByString() {
		// 获取当前日期
		String strTimestamp = new SimpleDateFormat("yyyy-MM-dd")
				.format(Calendar.getInstance().getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return strTimestamp;
	}
	/**
	 * 获取当前时间 时间格式自定义
	 */
	public static String todayByString(String format) {
		// 获取当前日期
		String strTimestamp = new SimpleDateFormat(format)
				.format(Calendar.getInstance().getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return strTimestamp;
	}

	/**
	 * 作用：获取当前时间 格式 12：10：20 返回类型：Date 参数：null
	 */
	public static Time time() {
		// 获取当前日期
		String strTime = new SimpleDateFormat("HH:mm:ss").format(Calendar
				.getInstance().getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return Time.valueOf(strTime);
	}
	
	/**
	 * 改变系统日期
	 *@param @param year
	 *@param @param month
	 *@param @param day
	 *@param @param hour
	 *@param @param minute
	 *@param @param second
	 *@param @throws IOException
	 *@param @throws InterruptedException
	 *@return void
	 *@throws
	 */
	public static void SetDateTime(String year, String month, String day,
			String hour, String minute, String second) throws IOException,
			InterruptedException {
		
		String command1 = "cmd /c date " + year + "-" + month + "-" + day;
		Process p = Runtime.getRuntime().exec(command1);
		p.waitFor();
		p.destroy();
		
		String command2 = "cmd /c time " + hour + ":" + minute + ":" + second;
		Process q = Runtime.getRuntime().exec(command2);
		q.waitFor();
		q.destroy();
		
	}
	
	/**
	 * 获取当前日期的前几月或者后几月日期
	 * @param day 月数 负数代表前几月，正数代表后几月
	 * @return date类型
	 */
	public static Date getDateByMonth(int month){
		// 获取当前日期
		Calendar date = Calendar.getInstance();
		date.set(Calendar.MONTH, date.get(Calendar.MONTH)+month);   		
		String strDate = new SimpleDateFormat("yyyy-MM-dd").format(date.getTime());
		// 将字符串日期转换成 java.sql.Date 日期类型
		return Date.valueOf(strDate);
	}
	
	/**
	 * string "YYYYMMDDhhmmss"  to string "YYYY-MM-DD hh:mm:ss"
	 */
	public static String formatDateString(String dateString) 
	{
		return dateString.substring(0, 4) + "-"+dateString.substring(4, 6)+"-"+dateString.substring(6, 8) + " "
		       +dateString.substring(8, 10)+":"+dateString.substring(10, 12)+":"+dateString.substring(12, 14);
	}
	
	
	public static void main(String []args){
//		String strTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
//		
//		String str=DateUtil.dateToString(DateUtil.datetime(), "HH:mm:ss");
//	
//		System.out.println(strTimestamp);
//		Date.valueOf(strTimestamp);
//		System.out.println(DateUtil.stringToDate(strTimestamp, "yyyy-MM-dd HH:mm:ss"));
//		java.util.Date date = Calendar.getInstance().getTime();
//		System.out.println(DateUtil.dateToString(date, "yyyyMMddHHmmssSSS")+","+Math.round(Math.random()*100));
//		System.out.println(DateUtil.dateToString(DateTransform.getDiffMonth(date, 36),"yyyy-MM-dd hh:mm:ss"));
//		java.util.Date vdate = DateUtil.stringToDate("2012-09-19 12:30:40", "yyyy-MM-dd HH:mm:ss");
		java.util.Date valDate = DateUtil.stringToDate("2014-06-20", "yyyy-MM-dd");
		java.util.Date nowDate = DateUtil.date();
		System.out.println(valDate + "," + nowDate);
		System.out.println(DateUtil.dateDiff(nowDate, valDate));
	}
}
